package cn.quevo.spring.util;

import java.io.IOException;
import java.util.HashMap;
import java.util.Map;
import java.util.Properties;

import javax.servlet.ServletContext;

import cn.quevo.core.lang.ColumnConvertUtils;
import cn.quevo.core.lang.StringUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.core.io.ClassPathResource;
import org.springframework.core.io.Resource;
import org.springframework.core.io.support.PropertiesLoaderUtils;
import org.springframework.web.context.support.ServletContextResource;

/**
 * 资源文件加载
 *
 * @author July july_sky@foxmail.com
 * @date 2017年6月30日 下午3:50:53
 * @Copyright ©2015-2035 湘豫(北京)科技有限公司. All Rights Reserved.
 */
public class PropertiesUtils {
    private Logger log = LoggerFactory.getLogger(PropertiesUtils.class);

    public static final PropertiesUtils application = new PropertiesUtils("application.properties");
    // 资源属性
    private Properties props;

    /**
     * 通过classPath路径加载属性文件
     *
     * @param path
     */
    public PropertiesUtils(String path) {
        try {
            Resource resource = new ClassPathResource(path);
            props = PropertiesLoaderUtils.loadProperties(resource);
        } catch (IOException e) {
            log.error(e.toString(), e);
        }
    }

    /**
     * 通过Servlet上下文加载属性文件
     *
     * @param path
     * @param context
     */
    public PropertiesUtils(String path, ServletContext context) {
        Resource resource = new ServletContextResource(context, path);
        try {
            props = PropertiesLoaderUtils.loadProperties(resource);
        } catch (IOException e) {
            log.error(e.toString(), e);
        }
    }

    /**
     * 根据key获取属性值
     *
     * @param key
     * @return
     * @author July july_sky@foxmail.com
     * @date 2016年10月12日上午11:13:11
     */
    public String getProperties(String key) {
        String val = props.getProperty(key);
        if (StringUtils.isBlank(val) && key.indexOf("-") <= 0) {
            return val;
        }
        return props.getProperty(formatKey(key));
    }

    /**
     * 获取属性值，如果没有则适用默认值
     *
     * @param key
     * @param defaultValue
     * @return
     * @author July july_sky@foxmail.com
     * @date 2016年10月12日上午11:13:11
     */
    public String getProperties(String key, String defaultValue) {
        String val = this.getProperties(key);
        return StringUtils.isBlank(val) ? defaultValue : val;
    }

    /**
     * 获取资源文件下所有的配置信息
     *
     * @return
     * @author July july_sky@foxmail.com
     * @date 2016年10月12日上午11:13:11
     */
    public Map<String, Object> getPropertiesMap() {
        Map<String, Object> params = new HashMap<>();
        if (this.props == null) {
            return params;
        }
        for (Object key : props.keySet()) {
            params.put(key.toString(), props.get(key));
        }
        return params;
    }

    /**
     * 获取资源文件对象
     *
     * @return
     * @author July july_sky@foxmail.com
     * @date 2016年10月12日上午11:13:11
     */
    public Properties getProperties() {
        return this.props;
    }

    /**
     * 格式化Key
     *
     * @param key
     * @return
     */
    private String formatKey(String key) {
        if (key.indexOf("-") == -1) {
            return key;
        }
        String ks[] = key.split("-");
        StringBuilder str = new StringBuilder(ks[0]);
        for (int i = 1; i < ks.length; i++) {
            str.append(ColumnConvertUtils.firstUpperCase(ks[i]));
        }
        return str.toString();
    }
}
